home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / MacHaskell 2.2 / import-export / init-modules.scm < prev    next >
Encoding:
Text File  |  1994-09-27  |  5.2 KB  |  146 lines  |  [TEXT/CCL2]

  1. ;;; This initializes the module ast structures.
  2.  
  3. ;;; This requires that the module table be created and updated with new
  4. ;;; modules first.  *unit* must also be defined.
  5.  
  6. ;;; Things initialized there:
  7. ;;;  all tables in the module structure
  8. ;;;  the module slot of all import declarations and entity-modules
  9. ;;;  The import Prelude is added when necessary
  10. ;;;  Empty export lists are explicated
  11.  
  12. (define (init-module-structure)
  13.   (when (not (eq? (module-type *module*) 'extension))
  14.     ;; If this is an extension, the incremental compiler has already
  15.     ;; filled in the compilation unit.
  16.     (setf (module-unit *module*) *unit*))
  17.   ;;; This processes the annotations.  Annotations used at the top
  18.   ;;; level of the module:
  19.   ;;;   {-#PRELUDE#-} : this contains definitions in the Haskell prelude
  20.   (setf (module-prelude? *module*) '#f)
  21.   (dolist (a (module-annotations *module*))
  22.     (when (annotation-value? a)
  23.       (let ((name (annotation-value-name a)))
  24.     (cond ((eq? name '|Prelude|)
  25.            (setf (module-prelude? *module*) '#t))))))
  26.   (cond ((eq? (module-type *module*) 'interface)
  27.      (setf (module-exported-modules *module*) (list *module*))
  28.      (process-interface-imports *module*))
  29.     ((eq? (module-type *module*) 'standard)
  30.      (init-standard-module))))
  31.  
  32. (define (init-standard-module)
  33.    (let ((seen-prelude? '#f)
  34.      (imports1 '())) ; used to filter out bad imports
  35.     (dolist (import (module-imports *module*))
  36.       (let* ((name (import-decl-module-name import))
  37.          (imported-mod (locate-module name)))
  38.     (when (eq? name '|Prelude|)
  39.        (setf seen-prelude? '#t))
  40.     (cond ((eq? imported-mod '#f)
  41.            (signal-undefined-module-import name))
  42.           ((eq? name *module-name*)
  43.            (signal-self-import name))
  44.           (else
  45.            (setf (import-decl-module import) imported-mod)
  46.            (push import imports1)))))
  47.     (setf (module-imports *module*) imports1)
  48.     (when (null? (module-exports *module*))
  49.     (setf (module-exports *module*)
  50.           (list (make entity-module (name *module-name*)
  51.                             (module *module*)))))
  52.     (when (not seen-prelude?)
  53.       (let ((prelude (locate-module '|Prelude|)))
  54.     (cond ((eq? prelude '#f)
  55.            (signal-missing-prelude))
  56.           ((module-prelude? *module*)
  57.            (setf (module-uses-standard-prelude? *module*) '#f)
  58.            (add-imported-module prelude))
  59.           (else
  60.            (setf (module-uses-standard-prelude? *module*) '#t)
  61.            (let ((fix-table (module-fixity-table *module*)))
  62.          (table-for-each (lambda (k v)
  63.                    (setf (table-entry fix-table k) v))
  64.                  *prelude-fixity-table*))))))
  65.     (let ((prelude-core (locate-module '|PreludeCore|)))
  66.        (if (eq? prelude-core '#f)
  67.        (signal-missing-prelude-core)
  68.        (when (module-prelude? *module*)
  69.          (add-imported-module prelude-core))))
  70.     (setf (module-exports *module*)
  71.       (filter-complete-module-exports (module-exports *module*))))
  72.     )
  73.  
  74.  
  75. (define (add-imported-module module)
  76.   (setf (module-imports *module*)
  77.     (cons (make import-decl
  78.             (module-name (module-name module))
  79.             (module module)
  80.             (mode 'all)
  81.             (specs '())
  82.             (renamings '()))
  83.           (module-imports *module*))))
  84.  
  85. (define (filter-complete-module-exports exports)
  86.   (if (null? exports)
  87.       '()
  88.       (let ((export (car exports))
  89.         (others (filter-complete-module-exports (cdr exports))))
  90.     (if (is-type? 'entity-module export)
  91.         (let* ((name (entity-name export))
  92.            (exported-mod (locate-module name)))
  93.           (cond ((not (memq name
  94.                 (cons *module-name*
  95.                       (map
  96.                        (lambda (import)
  97.                      (import-decl-module-name import))
  98.                        (module-imports *module*)))))
  99.              (signal-export-not-imported name))
  100.             ((not (eq? exported-mod '#f))
  101.              (push exported-mod (module-exported-modules *module*))))
  102.           others)
  103.         (cons export others)))))
  104.  
  105. (define (process-interface-imports module)
  106.   (let ((imports '()))
  107.     (dolist (i (module-imports module))
  108.       (let ((module (import-decl-module-name i))
  109.         (renamings (import-decl-renamings i)))
  110.     (dolist (s (import-decl-specs i))
  111.           (let* ((n (entity-name s))
  112.          (n1 (do-interface-rename n renamings)))
  113.         (when (assq n1 imports)
  114.                (signal-multiple-imports n1))
  115.         (push (tuple n1 (tuple module n)) imports)
  116.         (cond ((entity-class? s)
  117.            (dolist (m (entity-class-methods s))
  118.                      (let ((m1 (do-interface-rename m renamings)))
  119.                (when (assq m1 imports)
  120.                           (signal-multiple-imports m1))
  121.                (push (tuple m1 (tuple module m)) imports))))
  122.           ((entity-datatype? s)
  123.            (dolist (m (entity-datatype-constructors s))
  124.                      (let ((m1 (do-interface-rename m renamings)))
  125.                (when (assq m1 imports)
  126.                           (signal-multiple-imports m1))
  127.                (push (tuple m1 (tuple module m)) imports)))))))))
  128.     (setf (module-interface-imports module) imports)))
  129.  
  130. (define (signal-multiple-imports name)
  131.   (phase-error 'multuple-interface-import
  132.     "Interface file has more than one definition of ~A~%" name))
  133.  
  134. (define (do-interface-rename name renamings)
  135.   (if (has-con-prefix? (symbol->string name))
  136.       (let ((res (locate-renaming name renamings)))
  137.     (if (eq? res '#f)
  138.         name
  139.         (renaming-to res)))
  140.       (let* ((n1 (add-con-prefix/symbol name))
  141.          (res (locate-renaming n1 renamings)))
  142.     (if (eq? res '#f)
  143.         name
  144.         (remove-con-prefix/symbol (renaming-to res))))))
  145.  
  146.